//
//  native.hpp
//  AlterationSwitch
//
//  Created by solarke_apple_mini_1 on 2018/10/23.
//  Copyright © 2018年 石家庄科林电气股份有限公司. All rights reserved.
//

#ifndef native_hpp
#define native_hpp

#define GW376_HEAD_68H        0x68
#define GW376_TAIL_16H        0x16

#define GW376_FIRST_68H_POS        0
#define GW376_DATALEN_POS        1
#define GW376_SECOND_68H_POS    5
#define GW376_CTRL_POS            6
#define A1_POS                    7
#define A2_POS                    9
#define A3_POS                    11
#define AFN_POS                    12
#define    SEQ_POS                    13
#define FIRST_PN_POS            14
#define FIRST_FN_POS            16
#define DATA_START_POS          18


//get ctrl code
#define GDW_CTRLCODE_FUNC                    0x0F
#define GDW_CTRLCODE_FCV                    0x10
#define GDW_CTRLCODE_FCB                    0x20
#define GDW_CTRLCODE_PRM                    0x40
#define GDW_CTRLCODE_DIR                    0x00
#define GDW_CTRLCODE_DFC                    0x10
#define GDW_CTRLCODE_ACD                    0x20

//get seq
#define GDW_SEQ_PRSEQ                       0x0F
#define GDW_SEQ_CON                         0x10
#define GDW_SEQ_FIRFIN                      0x60
#define GDW_SEQ_TPV                         0x80

//seq define
#define GDW_SEQTPV_NONE                     0x0
#define GDW_SEQTPV_NEED                     0x80

#define GDW_SEQFIRFIN_MID                   0x0
#define GDW_SEQFIRFIN_LAST                  0x20
#define GDW_SEQFIRFIN_FIRST                 0x40
#define GDW_SEQFIRFIN_SINGLE                0x60

#define GDW_SEQCON_NONE                     0x0
#define GDW_SEQCON_NEED                     0x10

//链路层长度L低两位为规约标识，D0=0,D1=1表示本规约使用
#define GDW_LINKLEN_LOW2BIT                 0x02

#define AFN_SUREDENY        0x00    // 确认/否认
#define AFN_RESET            0x01    // 复位
#define AFN_LINKCHECK        0x02    // 链路接口检测
#define AFN_FORWARD         0x03    // 中继站命令
#define AFN_SETPARA            0x04    // 设置参数
#define AFN_CTRL            0x05    // 控制命令
#define AFN_AUTHOR            0x06    // 身份认证及密钥协商
//#define AFN_STANDBY            0x07    // 备用
#define AFN_ASKFORWARD        0x08    // 请求被级联终端主动上报
#define AFN_ASKTERMCONFIG    0x09    // 请求终端配置
#define AFN_ASKPARA            0x0A    // 查询参数
#define AFN_ASKTASKDATA        0x0B    // 请求任务数据
#define AFN_ASKONEDATA        0x0C    // 请求1类数据(实时数据)
#define AFN_ASKTWODATA        0x0D    // 请求2类数据(历史数据)
#define AFN_ASKTHREEDATA    0x0E    // 请求3类数据(事件数据)
#define AFN_FILETRANS        0x0F    // 文件传输
#define AFN_DATATRANS        0x10    // 数据转发

#define TO_ASK                0
#define TO_SET                1

#define INVALID_DATA        0xEE

#ifndef BCD_TO_BIN
#define BCD_TO_BIN(val) ( ((val) & 0xf) + ((val)>>4)*10 )
#endif

#ifndef BIN_TO_BCD
#define BIN_TO_BCD(val) ( (((val)/10)<<4) + (val)%10 )
#endif

typedef struct {
    unsigned short    year;
    unsigned char    month;
    unsigned char   day;
    unsigned char    hour;
    unsigned char    minute;
    unsigned char    second;
    unsigned char   week;
    unsigned short    msecond;
} T_SYSTEMTIME;


#include <stdio.h>

class nativeCC {
public:
    
    
    /****************************************************
     * 函数说明: get_framelen 获取报文长度
     *
     * 参数说明:  buf    -- 报文内容
     ****************************************************/
    static int get_framelen (unsigned char *buf);
    
    
    /****************************************************
     * 函数说明: get_datalen 获取数据域长度
     *
     * 参数说明:  buf    -- 报文内容
     ****************************************************/
    static int get_datalen (unsigned char *buf);
    
    
    /****************************************************
     * 函数说明: ctrl_fn003_send 控制换相
     *
     * 参数说明： mpNo      -- 测量点号
     *           fromphase -- 源相位,    1: A相，2: B相，3: C相
     *           tophase   -- 目标相位,  1: A相，2: B相，3: C相
     *
     * 返回值: 报文
     ****************************************************/
    
    static unsigned char *ctrl_fn003_send (unsigned char *termaddr, unsigned char A3, int mpNo,
                                    unsigned char fromphase, unsigned char tophase);
    
    
    /****************************************************
     * 函数说明: askOneData_fn15_send 换相开关在线状态
     *
     * 参数说明：
     *
     * 返回值： 报文
     ****************************************************/
    static unsigned char *askOneData_fn15_send (unsigned char *termaddr, unsigned char A3);
    
    
    /****************************************************
     * 函数说明: askOneData_fn179_send 电压不平衡度和电流不平衡度
     *
     * 参数说明：
     *
     * 返回值： 报文
     ****************************************************/
    static unsigned char *askOneData_fn179_send (unsigned char *termaddr, unsigned char A3);
    /****************************************************
     * 函数说明: askOneData_fn181_send 换相开关(三相电压、负荷电流、负荷电压、负荷功率因数、负荷电流、电压不平衡度)
     *
     * 参数说明：mpNo      -- 测量点号
     *
     * 返回值： 报文
     ****************************************************/
    static unsigned char *askOneData_fn181_send (unsigned char *termaddr, unsigned char A3,int mpNo);
    
    /****************************************************
     * 函数说明: askTwoData_fn239_send 日冻结换相开关总次数
     *
     * 参数说明：mpNo      -- 测量点号
     *           year      -- 年(18)
     *           month     -- 月
     *           day       -- 日
     *
     * 返回值：报文
     ****************************************************/
    static unsigned char *askTwoData_fn239_send (unsigned char *termaddr, unsigned char A3,int mpNo,
                                          int year, unsigned char month, unsigned char day);
    
    /****************************************************
     * 函数说明: askTwoData_fn240_send 日冻结换相开关总次数
     *
     * 参数说明：mpNo      -- 测量点号
     *           year      -- 年(18)
     *           month     -- 月
     *
     * 返回值: 报文
     ****************************************************/
    static unsigned char *askTwoData_fn240_send (unsigned char *termaddr, unsigned char A3,
                                          int mpNo, int year, unsigned char month);
    
    /****************************************************
     * 函数说明: askOneData_fn15_recv 解析一类数据 换相开关在线状态
     *
     * 参数说明:  frame    -- 报文内容
     *
     * 返回值: 解析出来的数据字符串
     ****************************************************/
    static char *askOneData_fn15_recv (unsigned char *frame);
    
    /****************************************************
     * 函数说明: askOneData_fn179_recv 解析一类数据 电压不平衡度和电流不平衡度
     *
     * 参数说明:  frame    -- 报文内容
     *
     * 返回值: 解析出来的数据字符串
     ****************************************************/
    static char *askOneData_fn179_recv (unsigned char *frame);

    /****************************************************
     * 函数说明: askOneData_fn181_recv 解析一类数据   换相开关(三相电压、负荷电流、负荷电压、负荷功率因数、负荷电流、电压不平衡度)
     *
     * 参数说明:  frame    -- 报文内容
     *
     * 返回值: 解析的数据字符串
     ****************************************************/
    static char *askOneData_fn181_recv (unsigned char *frame);
    
    /****************************************************
     * 函数说明: askTwoData_fn239_recv 解析二类数据 日冻结换相开关动作次数
     *
     * 参数说明:  frame    -- 报文内容
     *
     * 返回值： 解析数据的字符串
     ****************************************************/
    static char *askTwoData_fn239_recv (unsigned char *frame);
    
    /****************************************************
     * 函数说明: askTwoData_fn240_recv 解析二类数据 月冻结换相开关动作次数
     *
     * 参数说明:  frame    -- 报文内容
     *
     * 返回值：解析数据的字符串
     ****************************************************/
    static char *askTwoData_fn240_recv (unsigned char *frame);
    
    /****************************************************
     * 函数说明: parse_recv_frame 解析接收的报文
     *
     * 参数说明:  frame    -- 报文内容
     *
     * 返回值：解析的数据字符串
     ****************************************************/
    static char *parse_recv_frame (unsigned char *frame);
};

#endif /* native_hpp */
